package com.tarena.lbs.basic.service.impl;

import com.tarena.lbs.basic.dao.mapper.AreaMapper;
import com.tarena.lbs.basic.pojo.po.AreaPO;
import com.tarena.lbs.basic.pojo.vo.AreaVO;
import com.tarena.lbs.basic.service.AreaService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class AreaServiceImpl implements AreaService {
    
    @Autowired
    private AreaMapper areaMapper;
    
    @Override
    public List<AreaVO> queryProvinces() {
        // 查询省级地区列表
        List<AreaPO> provincePOs = areaMapper.selectProvinceList();
        // 转换为VO列表
        return convertToVOs(provincePOs);
    }
    
    @Override
    public List<AreaVO> queryChildren(Long parentId) {
        // 根据父ID查询子地区列表
        List<AreaPO> childPOs = areaMapper.selectByParentId(parentId);
        // 转换为VO列表
        return convertToVOs(childPOs);
    }
    
    @Override
    public List<AreaVO> queryAreaTree() {
        // 查询所有地区
        List<AreaPO> allPOs = areaMapper.selectAll();
        
        // 转换为VO列表
        List<AreaVO> allVOs = convertToVOs(allPOs);
        
        // 构建地区树结构
        return buildAreaTree(allVOs);
    }
    
    /**
     * 将PO列表转换为VO列表
     */
    private List<AreaVO> convertToVOs(List<AreaPO> pos) {
        if (pos == null || pos.isEmpty()) {
            return Collections.emptyList();
        }
        
        return pos.stream()
                .map(this::convertToVO)
                .collect(Collectors.toList());
    }
    
    /**
     * 将单个PO转换为VO
     */
    private AreaVO convertToVO(AreaPO po) {
        AreaVO vo = new AreaVO();
        BeanUtils.copyProperties(po, vo);
        vo.setChildren(new ArrayList<>());
        return vo;
    }
    
    /**
     * 构建地区树结构
     */
    private List<AreaVO> buildAreaTree(List<AreaVO> allVOs) {
        // 创建Map用于快速查找
        Map<Long, AreaVO> areaMap = new HashMap<>();
        List<AreaVO> roots = new ArrayList<>();
        
        // 将所有地区放入Map中
        for (AreaVO vo : allVOs) {
            areaMap.put(vo.getId(), vo);
        }
        
        // 构建树结构
        for (AreaVO vo : allVOs) {
            Long parentId = vo.getParentId();
            if (parentId == 0) {
                // parentId为0的是根节点（省级地区）
                roots.add(vo);
            } else {
                // 找到父节点并添加当前节点为子节点
                AreaVO parent = areaMap.get(parentId);
                if (parent != null) {
                    parent.getChildren().add(vo);
                }
            }
        }
        
        return roots;
    }
}